import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

// https://www.nowcoder.com/questionTerminal/bf877f837467488692be703735db84e6
// https://www.luogu.com.cn/problem/P4799
public class 牛牛的背包问题 {
    public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in = new Read();
    public static int MAXN = 41; // 最大的数量
    public static int MAXM = 1 << 20; // 双向广搜砍一半的值
    public static long[] arr = new long[MAXN]; // 存储的所有值
    public static long[] lsum = new long[MAXM]; // 左边的结果
    public static long[] rsum = new long[MAXM]; // 右边的结果
    public static long m; // 目标值
    public static int n; // 数量
    public static void main(String[] args) throws IOException {
        // 读取输入
        n = in.nextInt();
        m = in.nextLong();
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextLong();
        }

        out.println(compute());
        out.close();
    }

    private static long compute() {
        long ans = 0; // 返回值
        // 区间 开始位置, 结束位置, 开始的大小, 要求的大小
        // 这里有一个细节的地方, [0,n / 2) 右半边的是不算再区间内的,实际上是左开右闭区间
        int lsize = dfs (0,n / 2,0,m,lsum,0);
        int rsize = dfs (n / 2,n,0,m,rsum,0);
        // 排序, 为了使用双指针
        Arrays.sort(lsum,0,lsize);
        Arrays.sort(rsum,0,rsize);
        int i = 0; // 左半边的指针
        int j = rsize - 1; // 右半边的指针
        while (i < lsize && j >= 0) { // 同时满足左半边的指针没有走到尽头,右半边的指针没有走到最后
            // 如果左半边的小值和右半边的大值相加没达到要求,结果加右半边的长度, 左边的值往前移一位增大
            if (lsum[i] + rsum[j] <= m) {
                ans += j + 1;
                i++;
            } else {
                j--; // 不满足说明大于目标值了,右半边的减小
            }
        }
        return ans; // 返回所有的方法数
    }

    private static int dfs (int a, int b, long s, long w, long[] ans, int j) {
        // j 属于 ans 的长度
        if (s > w) { // 如果超过了目标值直接返回 j
            return j;
        }
        // s <= w
        // 没超过目标值,并且位置移到了最后一位,ans 里的值存储一下
        if (a == b) {
            ans[j++] = s;
        } else {
            // 没有到最后一位,不选和选
            j = dfs(a + 1,b,s,w,ans,j);
            j = dfs(a + 1,b,s + arr[a],w,ans,j);

        }
        return j; //返回下标
    }


    public static class Read {
        public static StringTokenizer st = new StringTokenizer("");
        public static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String next() throws IOException {
            while (!st.hasMoreTokens()) {
                st = new StringTokenizer(bf.readLine());
            }
            return st.nextToken();
        }
        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }
    }
}